<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 封装是面向对象思想中比较重要的一部分，js面向对象可以通过 构造函数 实现的 封装

    // 总结：
    // 1.构造函数体现了面向对象的封装特性
    // 2.构造函数实例创建的对象彼此独立、互不影响

    // 构造函数  公共的属性和方法  封装到 Star 构造函数里面了
    // 1.公共的属性写到 构造函数里面
    function Star(uname, age) {
      this.uname = uname
      this.age = age
      // this.sing = function () {  此方法应写到外面
      //   console.log('我会唱歌')
      // }
    }
    // console.log(ldh === zxy)  // false
    // console.log(ldh.sing === zxy.sing)  // 结果是 false 说明俩虽然同名但俩函数不一样
    const ldh = new Star('刘德华', 55)
    const zxy = new Star('张学友', 58)

    // 虽然构造函数方法很好用，但是 （构造函数复杂数据类型）存在浪费内存的问题
    // 我们希望所有的对象使用同一个函数，这样就比较节省内存，那么我们要怎样做呢？
    console.dir(Star.prototype)  // 返回一个对象称为原型对象
    // 2.公共的方法写到 原型对象身上
    Star.prototype.sing = function () {
      console.log('我会唱歌')
    }
    ldh.sing()  // 调用
    zxy.sing()  // 调用
    console.log(ldh.sing === zxy.sing)  // 结果是 true 说明俩虽函数一样了，共享
  </script>
</body>

</html>